/*
 * GeneradorArbol.java
 * Clase que provee varios metodos estaticos para la generacion del
 * arbol sintatico y parsea las operaciones
 * Ana Silvia Gonzales Torres 10194
 * Diego Alejandro Enriquez Rodriguez 10038
 */
package gramatica;

import gui.GUI;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTree;
import arbol.Nodo;
import javax.swing.tree.DefaultTreeModel;

/**
 *
 * @author Ana Silvia Gonzáles
 * @author Diego Enríquez
 */

public class GeneradorArbol {
    /**
     * Representa el arbol que se va a generar
     */
    private static DefaultTreeModel modelo;
    /**
     * Indica si hubo error en el proceso de parseo
     */
    private static boolean noError;
    
    /**
     * Crea un nodo y lo inserta en el modelo
     * 
     * @param nombre El nombre del nodo
     * @param padre El nombre del padre del nodo
     * @param linea La linea asociada al nodo
     * @param columna La columna asociada al nodo
     */
    public static void crearNodo(String nombre, Nodo padre, int linea, int columna){
        Nodo nuevo = new Nodo(nombre, linea, columna);
        modelo.insertNodeInto(nuevo, padre, padre.getChildCount());
    }
    
    /**
     * Crea el nodo padre
     * 
     * @param nombre El nombre del nodo.
     * @param linea La linea asociada al nodo
     * @param columna La columna asociada al nodo
     * @return 
     */
    public static Nodo crearNodo(String nombre, int linea, int columna){
        return new Nodo(nombre, linea, columna);
    }
    
    /**
     * Inserta el nodo raiz en el modelo.
     * 
     * @param nodo El nodo raiz
     */
    public static void insertarNodo(Nodo nodo){
        modelo = new DefaultTreeModel(nodo);
    }
    
    /**
     * Permite parsear el codigo a ser ejecutado.
     * 
     * @param codigo El codigo a ser ejecutado
     * @return El arbol generado con el modelo.
     */
    public static JTree parsear(String codigo){
        FileWriter filewriter = null;
        noError = true;
        try {
            File nueva = File.createTempFile("Cosa", ".txt");
            filewriter = new FileWriter(nueva);
            filewriter.write(codigo);
            filewriter.close();
            gramatica.Scanner scanner = new gramatica.Scanner(nueva.getPath());
            gramatica.Parser parser = new gramatica.Parser(scanner);
            parser.fatherOfFathers = gramatica.GeneradorArbol.crearNodo("SQL", 0, 0);
            insertarNodo(parser.fatherOfFathers);
            parser.Parse();
            nueva.deleteOnExit();
        }
        catch (Exception e){
            try {
                filewriter.close();
            } catch (IOException ex) {
                Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (noError) {
            revisar();
        }
        return new JTree(modelo);
    }
    
    /**
     * Inicia el proceso de Revision del arbol
     */
    private static void revisar(){
        SistemaDeTipos sistema = new SistemaDeTipos((Nodo) modelo.getRoot());
        sistema.rev();
    }

    /**
     * Permite cambiar el atributo noError.
     * 
     * @param noError El valor para el atributo.
     */
    public static void setNoError(boolean noError) {
        GeneradorArbol.noError = noError;
    }
}
